package foot.servlet.utils;

import java.io.IOException;
import java.util.Stack;
import java.io.*;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.SimpleTagSupport;

import foot.modele.Equipe;
import foot.modele.Match;

 /**
 * @author trt
 *	class implementant le tag jorgchartTree pour transformer 
 *	l'arbre des match en liste html pour être interprété par jOrgChart
 */
public class JOrgChartTreeTag extends SimpleTagSupport
{
	
	private Match match = null; 
//	@Override
//	public void doTag() throws JspException, IOException {
//		if(match !=null)
//		{
//			//initialisation
//			JspWriter out = getJspContext().getOut();
//			Stack<Match> pile = new Stack<Match>();
//			//racine
//			pile.push(match);
//			out.println("<ul id=\"org\" style=\"display:none\">");
//			
//			Match cour = match;
//			boolean fin = false;
//			while( ! fin)
//			{
//				//parcours en profondeur
//				while(cour != null)
//				{
//					printElem(out, cour, false);
//					if(cour.getPred1() != null && cour.getPred2() != null)
//					{
//						//noeud
//						out.println("<ul> ");
//						pile.push(cour);
//						cour = cour.getPred1();
//					}
//					else
//					{
//						out.println("</li>");
//					}
//				}
//				boolean ok  =false;
//				
//				while( !ok )
//				if(! pile.empty())
//				{
//					cour = pile.pop(); //on recupère la feuille
//					Match parent = pile.peek();
//					
//					//on a fini les fils 
//					if(cour.equals(parent.getPred2()))
//					{
//						//on ferme donc la sous liste
//						out.println("</ul>");
//						//on referme le parent
//						out.println("</li>");
//					}
//					else
//					{
//						//si on est different du pred2 de parent 
//						//on a pas fini de parcourir les fils
//						//on passe a pred2
//						cour = cour.getPred2();
//						//on va refaire un parcours en profondeur
//						ok=true;
//					}
//				}
//				else
//				{
//					fin = true;
//				}
//				
//			}
//		}
//	}
	
	@Override
	public void doTag() throws JspException, IOException {
		JspWriter out = getJspContext().getOut();
		if(match != null)
		{	
			if(match.isEstTermine()) {
				Equipe vainqueur = match.vainqueur();
				out.println("<h3>Le vainqueur du tournoi est " + vainqueur.getNomEquipe() + "</h3>");
			}
			out.println("<ul id=\"org\" style=\"display:none\">");
			recursivePrint(match, match, out);
			out.println("</ul>");			
		}
		else
		{
			out.println("Le tournoi va commencer prochainement");
		}
	}
	
	/** getters and setters **/
	
	public Match getMatch() {
		return match;
	}
	public void setMatch(Match match) {
		this.match = match;
	}
	
	/** utils **/
	
	private void recursivePrint(Match racine,Match m,JspWriter out) throws JspException,IOException
	{
		//cas d'arret
		if(m != null)
		{
			if(m.getPred1() == null || m.getPred2()==null)
			{
				printElem(out,m,false);
				out.println("</li>");
			}
			else
			{
				printElem(out,m,false);
				out.println("<ul>");
				recursivePrint(racine, m.getPred1(), out);
				recursivePrint(racine, m.getPred2(), out);
				out.println("</ul>");
				out.println("</li>");
			}
		}
	}
	
	private void printElem(JspWriter out , Match m, boolean hidden) throws IOException
	{
		if(!hidden)
		{
			out.println("<li> ");
			if(m.getEquipe1() != null && m.getEquipe2() != null)
			{
				out.println("<a href=\"?action=detailmatch&idmatch=" + m.getId() + "\">" + m.getEquipe1().getNomEquipe() +" Vs "+ m.getEquipe2().getNomEquipe() + "<br>" + m.score() + "</a>");
			}
			else
				out.println("prochainement");	
		}
		else
		{
			//TODO
		}
	}
}